import {computed} from 'vue'
import type {API} from '@/type/type'
import DateUtil from "@/utils/DateUtils"

export type LessonStatus = 'normal' | 'overdue' | 'forbid' | 'full' | 'start' | 'reserved'

export type LessonStatusConfig = {
  [key in LessonStatus]: {
    text: string
    color: string
    bgColor: string
    tagType: 'success' | 'warning' | 'danger' | 'default' | 'primary'
  }
}

// 状态配置映射表（包含文字、颜色和背景色）
const LESSON_STATUS_CONFIG: LessonStatusConfig = {
  normal: {
    text: '可预约',
    color: '#07c160', // 绿色
    bgColor: '#f2fbf6',
    tagType: 'success'
  },
  full: {
    text: '已满员',
    color: '#ff4d4f', // 红色
    bgColor: '#fff2f0',
    tagType: 'danger'
  },
  forbid: {
    text: '禁止预约',
    color: '#faad14', // 橙色
    bgColor: '#fffbe6',
    tagType: 'warning'
  },
  start: {
    text: '已开始',
    color: '#1890ff', // 蓝色
    bgColor: '#e6f7ff',
    tagType: 'primary'
  },
  overdue: {
    text: '已结束',
    color: '#8c8c8c', // 灰色
    bgColor: '#f5f5f5',
    tagType: 'default'
  },
  reserved: {
    text: '已预约',
    color: '#722ed1',
    bgColor: '#f9f0ff',
    tagType: 'primary'
  }
}

export function useLesson(lesson: API.ILesson) {
  /**
   * 计算课程状态（优先级从高到低）
   * - overdue: 已过期 (endTime < 当前时间)
   * - start: 预约超时 (startTime < 当前时间 < endTime 且 status=1 且未满员)
   * - forbid: 禁止预约 (status=3)
   * - full: 已满员 (status=2 或 currentStudents >= maxStudents)
   * - normal: 可预约 (status=1 且未满员)
   */
  const status = computed<LessonStatus>(() => {
    const now = new Date()
    // 1. 检查是否已过期
    if (DateUtil.isBefore(lesson.endTime, now)) {
      return 'overdue'
    }
    // 2. 检查是否预约超时（课程已开始但未结束）
    if (
      DateUtil.isBefore(lesson.startTime, now) && lesson.status === '1' && lesson.currentStudents < lesson.maxStudents) {
      return 'start'
    }
    // 3. 检查是否禁止预约
    if (lesson.status === '3') {
      return 'forbid'
    }
    // 4. 检查是否已满员
    if (lesson.status === '2' || lesson.currentStudents >= lesson.maxStudents) {
      return 'full'
    }
    // 判断是否已预约
    if (lesson?.signInStatus && lesson?.signInStatus === '1') {
      return 'reserved'
    }
    // 6. 默认正常状态
    return 'normal'
  })

  /**
   * 计算剩余名额
   */
  const remainingSeats = computed(() => {
    return Math.max(0, lesson.maxStudents - lesson.currentStudents)
  })

  /**
   * 计算课程时长（小时）
   */
  const duration = computed(() => {
    if (!lesson.startTime || !lesson.endTime) return 0
    const start = new Date(lesson.startTime)
    const end = new Date(lesson.endTime)
    return Number(((end.getTime() - start.getTime()) / (1000 * 60 * 60)).toFixed(1))
  })
  /**
   * 是否可预约
   */
  const canReserve = computed(() => status.value === 'normal')
  /**
   * 是否可取消预约
   */
  const canCancel = computed(() => {
    return !['overdue', 'forbid', 'start'].includes(status.value)
  })

  const currentStatusConfig = computed(() => LESSON_STATUS_CONFIG[status.value])

  return {
    status,
    remainingSeats,
    duration,
    canReserve,
    canCancel,
    currentStatusConfig,
    // 状态判断快捷方式
    isOverdue: computed(() => status.value === 'overdue'),
    isForbid: computed(() => status.value === 'forbid'),
    isFull: computed(() => status.value === 'full'),
    isNormal: computed(() => status.value === 'normal'),
    isTimeout: computed(() => status.value === 'start'),

    // 状态文本映射
    statusText: computed(() => {
      switch (status.value) {
        case 'normal':
          return '可预约'
        case 'full':
          return '已满员'
        case 'forbid':
          return '禁止预约'
        case 'start':
          return '已开始'
        case 'overdue':
          return '已结束'
        default:
          return '未知状态'
      }
    })
  }
}

export default useLesson
